package boot

import (
	"appService/src/authValid"
	"appService/src/global"
	"appService/src/libs/utils"
	"appService/src/orm"
	"github.com/gogf/gf/frame/g"
	"log"
	"os"
	"path/filepath"
	"strings"
)

/*
➤
✿
┏━
┣━
┗━
*/
//初始化，系统配置，全局变量
func initApplication() {
	//获取并设置当前程序运行的根目录
	global.ApplicationDir = filepath.Dir(os.Args[0])
	//设置配置文件路径
	err := g.Cfg().SetPath(filepath.Join(global.ApplicationDir, "/config"))
	if err != nil {
		log.Fatalf("设置配置文件路径失败，错误：%v", err)
	}
	global.Debug = g.Cfg().GetBool("server.Debug", false)
	global.ApiRootPath = g.Cfg().GetString("server.ApiRootPath", "/api")
	err = g.Log().SetPath(filepath.Join(global.ApplicationDir, g.Cfg().GetString("logger.path")))
	if err != nil {
		log.Fatalf("设置日志文件路径失败，错误：%v", err)
	}
	//设置日期文件名称
	//g.Log().SetFile(appName+"-{Y-m-d}.log")
	//是否开启堆栈打印
	g.Log().SetStack(false)

	if global.Debug {
		g.Log().SetStdoutPrint(true) //终端日志输出
		g.Log().SetAsync(false)
	} else {
		g.Log().SetStdoutPrint(false) //关闭终端的日志输出
		g.Log().SetAsync(true) //设置日志异步输出
	}
	// 获取全局变量在配置文件中的值
	global.SingleLogin = g.Cfg().GetBool("server.SingleLogin", false)                //是否单点登陆
	global.SingleLoginTime = g.Cfg().GetInt64("server.SingleLoginTime", 600)         //强制登陆间隔秒
	global.EncryptionString = g.Cfg().GetString("token.EncryptionStr", "penghongqi") //密码加密字符串
	global.TokenKeyString = g.Cfg().GetString("token.TokenKey", "penghongqi")        //Token加密字串
	global.TokenExpiresAt = g.Cfg().GetInt64("token.TokenExp", 604800)               //token过期时间（秒）
	global.DESKey = g.Cfg().GetString("crypot.DESKey", "5dh8uo9e")                   //DES加解密密钥
	global.AESKey = g.Cfg().GetString("crypot.AESKey", "2j6f7j9c")                   //aes加解密密钥
	global.FileRootDir = g.Cfg().GetString("file.FileServerRootDir", "")             //文件存储根路径
	global.FilePathDir = g.Cfg().GetString("file.FilePathDir", "")                   //文件存储路径
	uploadFileSize := g.Cfg().GetInt64("file.UploadFileSize", 512)                   // 上传文件大小
	global.UploadFileSize = uploadFileSize * 1024 * 1024
	if global.FileRootDir == "" {
		global.FileRootDir = filepath.Join(global.ApplicationDir, "/wwwFiles")
	}
	global.FileUploadDir = filepath.Join(global.FileRootDir, global.FilePathDir)
	global.ChatSaveDir = filepath.Join(global.ApplicationDir, "chatFiles")
	extStr := g.Cfg().GetString("file.FileExt", "")          //可上传的文件后缀
	echoFileExt := g.Cfg().GetString("file.EchoFileExt", "") //输出的文件后缀
	if extStr != "" {
		extArr := strings.Split(extStr, ",")
		global.FileExt = make(map[string]bool)
		for _, v := range extArr {
			global.FileExt[v] = true
		}
	}
	if echoFileExt != "" {
		echoFileExtArr := strings.Split(echoFileExt, ",")
		global.EchoFileExt = make(map[string]bool)
		for _, v := range echoFileExtArr {
			global.EchoFileExt[v] = true
		}
	}
}

func BootInit() {
	g.Log().Info("➤ 启动服务……")
	//初始化，系统配置，全局变量
	initApplication()
	g.Log().Info("✿ 当前项目根目录：", global.ApplicationDir)
	//文件存储路径
	g.Log().Info("✿ 文件存储根目录：", global.FileRootDir)
	g.Log().Info("✿ 文件存储根相对目录：", global.FilePathDir)
	g.Log().Info("✿ 文件存储根完整目录：", global.FileUploadDir)
	g.Log().Info("✿ 聊天文件存储完整目录：", global.ChatSaveDir)
	if !utils.PathExists(global.FileUploadDir) {
		err := os.MkdirAll(global.FileUploadDir, 0666)
		if err != nil {
			log.Fatalf("✖ 创建文件存储目录错误，错误：%v", err)
		}
	}
	if !utils.PathExists(global.ChatSaveDir) {
		err := os.MkdirAll(global.ChatSaveDir, 0666)
		if err != nil {
			log.Fatalf("✖ 创建聊天文件存储目录错误，错误：%v", err)
		}
	}
	//设置上传文件的大小
	g.Server().SetClientMaxBodySize(global.UploadFileSize)
	//初始化数据库
	orm.Init()
	//初始化系统
	Init()
	//初始化数据接口验证
	authValid.Init()
	g.Log().Info("✿ 服务启动完成")
}
